<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        li{
            line-height: 40px
        }
        span {
            color: red;
            font-weight: bold
        }
    </style>
</head>
<body>
   <h2>创建对象</h2>
   <ul>
       <li>
           <h3>工厂模式</h3>
           <ul>
               <li>形式上是在一个函数内创建对象，最后返回一个对象</li>
               <li>缺点是创造出来的对象无法一眼看出来时哪一种对象，得通过手动获取才可以</li>
           </ul>
       </li>
       <li>
           <h3>构造函数</h3>
           <ul>
               <li>
                   <h4>new操作符之后执行的步骤</h4>
                   <ul>
                       <li>创建一个空对象</li>
                       <li>改变this指向，指向新建的对象</li>
                       <li>执行构造函数中的代码</li>
                       <li>返回这个新对象</li>
                   </ul>
               </li>
               <li> 比较对象是否相等，是比较两个是不是同一对象。比较两个对象大小，比较的才是valueOf</li>
               <li>缺点是每创建一个新的对象，就要实例化一次方法和属性，无法实现共享（可以通过原型模式来解决）</li>
               <li>
                   通过构造函数实例化的对象有一个constructor属性，指向构造函数，但是一般不用于检测对象类型(字面量方式创建的对象也有constructor属性)
               </li>
           </ul>
       </li>
       <li>
           <h3>原型模式</h3>
           <ul>
               <li>
                   无论什么时候，当我们创建了一个函数，（<span>是创建函数的时候，而不是创建对象的时候，创建函数创建了一次，所以原型也只创建了一次。改变就会牵连其他对象受影响</span>）就会创建一个函数的原型。函数中一个属性叫prototype,这个prototype指向函数原型
                </li>
                <li>
                    默认情况下，所有原型对象都会自动获得一个constructor属性
                    <span>（不光通过构造函数创建的实例有，函数的原型对象也有）</span>
                    这个constructor与上面的一样，都指向构造函数
                </li>
               <li>
                   使用原型对象的好处是可以让所有对象共享它包含的所有书属性和方法
               </li>
               <li>
                   函数的原型独立于函数之外，不属于函数。函数内的prototype指针，指向这个原型。<span>（如果是从属关系，每new 一个对象，都会执行构造函数内部的代码，都会创建一个新的原型，那么修改原型中的属性将会互不影响，但事实不是这样）</span>
               </li>
               <li>
                   创建了自定义构造函数之后，其原型对象默认只会取得constructor属性，其他方法，都是继承自Object （<span>查看普通对象，可以发现普通对象的__proto__里有好多方法，这些方法就是从Object那里来的</span>）   
               </li>
               <li>当利用构造函数实例化一个对象后，实例内部会包含一个__proto__属性，这个属性指向构造函数原型对象</li>
               <li>
                   代码读取属性的搜所过程：先搜索实例属性，实例属性找到了就返回。找不到继续搜寻原型对象中，找到就返回
               </li>
               <li>通过对象实例重写原型中的值时，相当于给实例新增属性</li>
           </ul>
       </li>
   </ul>
    <script src="./6.2.1-2工厂与构造函数.js"></script>
    <script src="./6.2.3原型模式-1.js"></script>
</body>
</html>